<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>

    // Promise的优点:
    // 有了Promise对象，就可以将异步操作以同步操作的流程表达出来，避免了层层嵌套的回调函数。此外，Promise对象提供统一的接口，使得控制异步操作更加容易。

    // Promise对象(实例化对象)的方法
    // then(resolveHandler,rejectHandler)     Promise 对象添加状态改变时的回调函数  
    // resolveHandler()    将Promise对象的状态 由 pending(进行中) 变为 fulfilled(已成功)执行此回调函数
    // rejectHandler()    将Promise对象的状态 由 pending(进行中) 变为 rejected(已失败)执行此回调函数

    // 返回值:  新的Promise对象  -> 链式操作

    // 注意: 
    // then() 调用发生在异步代码执行之前 => 可以理解为then()提前指定了状态改变时要执行的内容(回调函数), 等Promise状态改变后 -> 执行对应的回调函数
    // resolveHandler()  rejectHandler() 都有一个形式参数 -> 用于接收Promise对象中存储的数据

    // catch()
    // finally()


    debugger;
    var p = new Promise(function (resolve, reject) {
        // Promise接收一个回调函数 -> 容器 -> 一般用来执行一段代码(通常是异步操作 ,同步也可以)
        // 注意: Promise接收一个回调函数 => 同步任务 => new Promise() 调用时立即执行

        console.log("回调函数开始执行");

        setTimeout(function () {
            debugger;
            // 投一个硬币  -> 模拟是否拖堂

            var num = Math.random(); // [0,1)
            console.log("异步代码开始执行:", num);
            if (num >= 0.5) {
                resolve("正面"); //  {<fulfilled>:"正面"}
            } else {
                reject("反面");  // {<reject>:"反面"}
            }

        }, 2000)


    });
    console.log("48:", p);  //{<pending>:undefined}

    // then()  Promise 对象添加状态改变时的回调函数  
    // 注意: then() 调用发生在异步代码执行之前 => 可以理解为then()提前指定了状态改变时要执行的内容(回调函数),等Promise状态改变后 -> 执行对应的回调函数
    p.then(function (arg) {
        debugger;
        console.log("fulfilled", arg);
    }, function (arg) {
        debugger;
        console.log("rejected", arg);
    })
</script>

</html>